﻿using System;
using System.Collections.Generic;
using System.Text;

namespace IllustratedCsharp7_ch14_Lambda
{
    delegate int MyDel(int par);
    class Chapt14_14LambdaExpression
    {
        static void Main()
        {
            /*把匿名方法转为Lambda表达式
                删除delegate关键字
                在参数列表和匿名方法之间放置Lambda运算符=>。Lambda运算符诗作"gose to"。               
             */
            MyDel del = delegate (int x) { return x + 1; }; //匿名方法
            MyDel le1 = (int x) => { return x + 1; }; // Lambda表达式

            //编译器还可以从委托的声明中知道委托参数的类型，因此Lambda表达式允许省略类型参数
                //带有类型的参数列表为显示类型
                //省略类型的参数列表为隐式类型.
            MyDel le2 = (x) => { return x + 1; };

            //如果只有一个隐匿类型参数，我们可以省略两端的圆括号。
            MyDel le3 = x => { return x + 1; };

            //最后，Lambda表达式允许表达式的主体是语句块或表达式。
            MyDel le4 = x => x + 1;

            Console.WriteLine($"{del(12)}");
            Console.WriteLine($"{le1(12)}");
            Console.WriteLine($"{le2(12)}");
            Console.WriteLine($"{le3(12)}");
            Console.WriteLine($"{le4(12)}");

            /*
                 有关Lambda表达式的参数列表的要点如下。
                     Lambda表达式参数列表中的参数必须在参数数量、类型和位置上与委托相匹配。
                     表达式的参数列表中的参数不一定需要包含类型 (隐式类型)，除非委托有ref或out参数---此时必须注明类型（显式类型）
                     如果只有一个参数，并且是隐式类型，则两端的圆括号可以省略，否则必须有括号。
                     如果没有参数，必须使用一组空的圆括号。
             */
        }
    }
}
